package ie.flax.flaxengine.client.weave.presenter; import ie.flax.flaxengine.client.FVector; import ie.flax.flaxengine.client.FlaxEngine; import ie.flax.flaxengine.client.Graphic.FCamera; import ie.flax.flaxengine.client.events.CameraUpdateEvent; import ie.flax.flaxengine.client.events.CameraUpdateEventHandler; import ie.flax.flaxengine.client.events.EventBus; import ie.flax.flaxengine.client.events.MapUpdateEvent; import ie.flax.flaxengine.client.events.MapUpdateEventHandler; import ie.flax.flaxengine.client.weave.Weave; import ie.flax.flaxengine.client.weave.view.MiniMapView; import ie.flax.flaxengine.client.weave.view.Impl.MiniMapViewImpl; import java.util.Date; import com.google.gwt.user.client.ui.Widget; public class MiniMapPresenter extends AbstractPresenter implements MiniMapView.presenter, MapUpdateEventHandler, CameraUpdateEventHandler { private final Weave model; private final FCamera cam; private final MiniMapView view; private final int inverseScale = 12; // eg 8 if you want 1/8 scale private double oldTime = new Date().getTime(); private double currentTime; private double elapsedTime; private boolean isRunning = false; private boolean firstRun = true; @Override public void onMapUpdate(MapUpdateEvent e) { //if(firstRun){ // //this is in order to set up the canvas width and height (yes, I know, wtf) // draw(); // firstRun = false; //} if(isRunning){ currentTime = new Date().getTime(); elapsedTime = currentTime - oldTime; if(model.isRunning()){ if (elapsedTime > 2000){ oldTime = currentTime; draw(); } } } } @Override public void onCameraUpdate(CameraUpdateEvent e) { if(isRunning){ if (model.isRunning()){ clear(); draw(); drawCurrentCameraRectangle(); } } } public MiniMapPresenter(Weave editor) { this.model = editor; view = new MiniMapViewImpl(this); cam = new FCamera(new FVector(0, 0), FlaxEngine.camera.getWidth()* inverseScale, FlaxEngine.camera.getHeight() *inverseScale); view.getCanvas().getContext2d().scale(1.0 / inverseScale, 1.0 / inverseScale); EventBus.handlerManager.addHandler(MapUpdateEvent.TYPE, this); EventBus.handlerManager.addHandler(CameraUpdateEvent.TYPE, this); } @Override public Widget getView() { return view.getWidget(); } @Override public void moveMapCamera(int x, int y) { FlaxEngine.camera.setX((x * inverseScale) / 2); FlaxEngine.camera.setY((y * inverseScale) / 2); } @Override public void drawCurrentCameraRectangle() { view.getCanvas().getContext2d().setStrokeStyle("#F00"); view.getCanvas().getContext2d().setLineWidth(8.0); view.getCanvas().getContext2d().strokeRect( FlaxEngine.camera.getX(), FlaxEngine.camera.getY(), FlaxEngine.camera.getWidth(), FlaxEngine.camera.getHeight()); } private void clear() { view.getCanvas().getContext2d().fillRect(0, 0, view.getCanvas().getCoordinateSpaceWidth()*inverseScale, view.getCanvas().getCoordinateSpaceHeight()*inverseScale); } private void draw() { if (view.getCanvas().getCoordinateSpaceHeight() == 0) { view.getCanvas().setCoordinateSpaceHeight( view.getCanvas().getCanvasElement().getClientHeight()); view.getCanvas().setCoordinateSpaceWidth( view.getCanvas().getCanvasElement().getClientWidth()); view.getCanvas().getContext2d() .scale(1.0 / inverseScale, 1.0 / inverseScale); } model.getFMapReference().draw(cam, view.getCanvas(),-1); } @Override public void setRunning(boolean run) { isRunning = run; } @Override public boolean isRunning() { return isRunning; } }